hello there !!

2+2 
[1] 4
4+5
[1] 9

copy r formula ctrl +shift + i

data("present")
View(present)

Shortcuts

piping operator: ctrl + shift + m

assign operator: alt + -

Assignment

library(dplyr)
library(ggplot2)
library(statsr)
data(arbuthnot)
dim(arbuthnot)
[1] 82  3
names(arbuthnot)
[1] "year"  "boys"  "girls"
arbuthnot$boys
 [1] 5218 4858 4422 4994 5158 5035 5106 4917 4703 5359 5366 5518
[13] 5470 5460 4793 4107 4047 3768 3796 3363 3079 2890 3231 3220
[25] 3196 3441 3655 3668 3396 3157 3209 3724 4748 5216 5411 6041
[37] 5114 4678 5616 6073 6506 6278 6449 6443 6073 6113 6058 6552
[49] 6423 6568 6247 6548 6822 6909 7577 7575 7484 7575 7737 7487
[61] 7604 7909 7662 7602 7676 6985 7263 7632 8062 8426 7911 7578
[73] 8102 8031 7765 6113 8366 7952 8379 8239 7840 7640
ggplot(data = arbuthnot, aes(x = year, y = girls)) +
  geom_point()

arbuthnot <- arbuthnot %>%
  mutate(total = boys + girls)
ggplot(data = arbuthnot, aes(x = year, y = total)) +
  geom_line()

ggplot(data = arbuthnot, aes(x = year, y = total)) +
  geom_line() +
  geom_point()

arbuthnot <- arbuthnot %>%
  mutate(more_boys = boys > girls)
data(present)
dim(present)
[1] 74  3

Calculate the total number of births for each year and store these values in a new variable called total in the present dataset. Then, calculate the proportion of boys born each year and store these values in a new variable called prop_boys in the same dataset. Plot these values over time and based on the plot determine if the following statement is true or false: The proportion of boys born in the US has decreased over time.

True

False

present <- present %>% 
mutate(total = boys + girls)%>% 
mutate(prop_boys = boys/total)

ggplot(data = present, aes(x = year, y = prop_boys)) + geom_line()

Create a new variable called more_boys which contains the value of either TRUE if that year had more boys than girls, or FALSE if that year did not. Based on this variable which of the following statements is true?

Every year there are more girls born than boys.

Every year there are more boys born than girls.

Half of the years there are more boys born, and the other half more girls born.

present <- present %>%
mutate(more_boys = boys > girls)

ggplot(data = present, aes(x = year, y = more_boys)) + geom_line()

Calculate the boy-to-girl ratio each year, and store these values in a new variable called prop_boy_girl in the present dataset. Plot these values over time. Which of the following best describes the trend?

There appears to be no trend in the boy-to-girl ratio from 1940 to 2013.

There is initially an increase in boy-to-girl ratio, which peaks around 1960. After 1960 there is a decrease in the boy-to-girl ratio, but the number begins to increase in the mid 1970s.

There is initially a decrease in the boy-to-girl ratio, and then an increase between 1960 and 1970, followed by a decrease. The boy-to-girl ratio has increased over time.

There is an initial decrease in the boy-to-girl ratio born but this number appears to level around 1960 and remain constant since then.

present <- present %>%
mutate(prop_boy_girl = boys/girls)

ggplot(data = present, aes(x = year, y = prop_boy_girl)) + geom_line()
names(nycflights)
 [1] "year"      "month"     "day"      
 [4] "dep_time"  "dep_delay" "arr_time" 
 [7] "arr_delay" "carrier"   "tailnum"  
[10] "flight"    "origin"    "dest"     
[13] "air_time"  "distance"  "hour"     
[16] "minute"   
view(nycflights)
Error in view(nycflights) : could not find function "view"
str(nycflights)
Classes ‘tbl_df’ and 'data.frame':  32735 obs. of  16 variables:
 $ year     : int  2013 2013 2013 2013 2013 2013 2013 2013 2013 2013 ...
 $ month    : int  6 5 12 5 7 1 12 8 9 4 ...
 $ day      : int  30 7 8 14 21 1 9 13 26 30 ...
 $ dep_time : int  940 1657 859 1841 1102 1817 1259 1920 725 1323 ...
 $ dep_delay: num  15 -3 -1 -4 -3 -3 14 85 -10 62 ...
 $ arr_time : int  1216 2104 1238 2122 1230 2008 1617 2032 1027 1549 ...
 $ arr_delay: num  -4 10 11 -34 -8 3 22 71 -8 60 ...
 $ carrier  : chr  "VX" "DL" "DL" "DL" ...
 $ tailnum  : chr  "N626VA" "N3760C" "N712TW" "N914DL" ...
 $ flight   : int  407 329 422 2391 3652 353 1428 1407 2279 4162 ...
 $ origin   : chr  "JFK" "JFK" "JFK" "JFK" ...
 $ dest     : chr  "LAX" "SJU" "LAX" "TPA" ...
 $ air_time : num  313 216 376 135 50 138 240 48 148 110 ...
 $ distance : num  2475 1598 2475 1005 296 ...
 $ hour     : num  9 16 8 18 11 18 12 19 7 13 ...
 $ minute   : num  40 57 59 41 2 17 59 20 25 23 ...

rdu_flights <- nycflights %>%
  filter(dest == "RDU")

ggplot(data = rdu_flights, aes(x = dep_delay)) +
  geom_histogram()

rdu_flights %>%
  summarise(mean_dd = mean(dep_delay), sd_dd = sd(dep_delay), n = n())
  1. Create a new data frame that includes flights headed to SFO in February, and save this data frame as sfo_feb_flights. How many flights meet these criteria?
    1. 68
    2. 1345
    3. 2286
    4. 3563
    5. 32735
sfo_feb_flights <- nycflights %>%
  filter(dest == "SFO", month == 2)

sfo_feb_flights %>%
  summarise(n = n())
  1. Make a histogram and calculate appropriate summary statistics for arrival delays of sfo_feb_flights. Which of the following is false?
    1. The distribution is unimodal.
    2. The distribution is right skewed.
    3. No flight is delayed more than 2 hours.
    4. The distribution has several extreme values on the right side.
    5. More than 50% of flights arrive on time or earlier than scheduled.
ggplot(data = sfo_feb_flights, aes(x = arr_delay)) +
  geom_histogram(binwidth = 10)

nycflights <- nycflights %>%
  mutate(dep_type = ifelse(arr_delay < 5, "on time", "delayed"))

nycflights %>%
  group_by(origin) %>%
  summarise(ot_dep_rate = sum(dep_type == "on time") / n()) %>%   
  arrange(desc(ot_dep_rate))

LS0tDQp0aXRsZTogIkludHJvZHVjdGlvbiB0byBwcm9iYWJpbGl0eSBhbmQgZGF0YSINCmF1dGhvcjogImFiaGltYW55dSBuYXRoIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KKipoZWxsbyB0aGVyZSAhISoqDQoNCg0KYGBge3J9DQoyKzIgDQo0KzUNCmBgYA0KY29weSByIGZvcm11bGEgY3RybCArc2hpZnQgKyBpDQpgYGB7cn0NCg0KYGBgDQoNCiFbXShpbWFnZXMvMS5wbmcpDQoNCiFbXShpbWFnZXMvMi5wbmcpDQohW10oaW1hZ2VzLzMucG5nKQ0KIVtdKGltYWdlcy80LnBuZykNCiFbXShpbWFnZXMvNS5wbmcpDQohW10oaW1hZ2VzLzYucG5nKQ0KIVtdKGltYWdlcy83LnBuZykNCiFbXShpbWFnZXMvOC5wbmcpDQohW10oaW1hZ2VzLzkucG5nKQ0KIVtdKGltYWdlcy8xMC5wbmcpDQohW10oaW1hZ2VzLzExLnBuZykNCg0KYGBge3J9DQpkYXRhKCJwcmVzZW50IikNClZpZXcocHJlc2VudCkNCmBgYA0KDQoqKlNob3J0Y3V0cyoqDQoNCnBpcGluZyBvcGVyYXRvcjogY3RybCArIHNoaWZ0ICsgbQ0KDQphc3NpZ24gb3BlcmF0b3I6IGFsdCArIC0NCg0KIyBBc3NpZ25tZW50DQoNCmBgYHtyfQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoc3RhdHNyKQ0KYGBgDQoNCg0KYGBge3J9DQpkYXRhKGFyYnV0aG5vdCkNCmRpbShhcmJ1dGhub3QpDQpuYW1lcyhhcmJ1dGhub3QpDQphcmJ1dGhub3QkYm95cw0KZ2dwbG90KGRhdGEgPSBhcmJ1dGhub3QsIGFlcyh4ID0geWVhciwgeSA9IGdpcmxzKSkgKw0KICBnZW9tX3BvaW50KCkNCmFyYnV0aG5vdCA8LSBhcmJ1dGhub3QgJT4lDQogIG11dGF0ZSh0b3RhbCA9IGJveXMgKyBnaXJscykNCmdncGxvdChkYXRhID0gYXJidXRobm90LCBhZXMoeCA9IHllYXIsIHkgPSB0b3RhbCkpICsNCiAgZ2VvbV9saW5lKCkNCmdncGxvdChkYXRhID0gYXJidXRobm90LCBhZXMoeCA9IHllYXIsIHkgPSB0b3RhbCkpICsNCiAgZ2VvbV9saW5lKCkgKw0KICBnZW9tX3BvaW50KCkNCmFyYnV0aG5vdCA8LSBhcmJ1dGhub3QgJT4lDQogIG11dGF0ZShtb3JlX2JveXMgPSBib3lzID4gZ2lybHMpDQpgYGANCg0KDQpgYGB7cn0NCmRhdGEocHJlc2VudCkNCmRpbShwcmVzZW50KQ0KYGBgDQpDYWxjdWxhdGUgdGhlIHRvdGFsIG51bWJlciBvZiBiaXJ0aHMgZm9yIGVhY2ggeWVhciBhbmQgc3RvcmUgdGhlc2UgdmFsdWVzIGluIGEgbmV3IHZhcmlhYmxlIGNhbGxlZCB0b3RhbCBpbiB0aGUgIHByZXNlbnQgZGF0YXNldC4gVGhlbiwgY2FsY3VsYXRlIHRoZSBwcm9wb3J0aW9uIG9mIGJveXMgYm9ybiBlYWNoIHllYXIgYW5kIHN0b3JlIHRoZXNlIHZhbHVlcyBpbiBhIG5ldyB2YXJpYWJsZSBjYWxsZWQgcHJvcF9ib3lzIGluIHRoZSBzYW1lIGRhdGFzZXQuIFBsb3QgdGhlc2UgdmFsdWVzIG92ZXIgdGltZSBhbmQgYmFzZWQgb24gdGhlIHBsb3QgZGV0ZXJtaW5lIGlmIHRoZSBmb2xsb3dpbmcgc3RhdGVtZW50IGlzIHRydWUgb3IgZmFsc2U6IFRoZSBwcm9wb3J0aW9uIG9mIGJveXMgYm9ybiBpbiB0aGUgVVMgaGFzIGRlY3JlYXNlZCBvdmVyIHRpbWUuDQoNClRydWUNCg0KRmFsc2UNCmBgYHtyfQ0KcHJlc2VudCA8LSBwcmVzZW50ICU+JSANCm11dGF0ZSh0b3RhbCA9IGJveXMgKyBnaXJscyklPiUgDQptdXRhdGUocHJvcF9ib3lzID0gYm95cy90b3RhbCkNCg0KZ2dwbG90KGRhdGEgPSBwcmVzZW50LCBhZXMoeCA9IHllYXIsIHkgPSBwcm9wX2JveXMpKSArIGdlb21fbGluZSgpDQoNCmBgYA0KDQpDcmVhdGUgYSBuZXcgdmFyaWFibGUgY2FsbGVkIG1vcmVfYm95cyB3aGljaCBjb250YWlucyB0aGUgdmFsdWUgb2YgZWl0aGVyIFRSVUUgaWYgdGhhdCB5ZWFyIGhhZCBtb3JlIGJveXMgdGhhbiBnaXJscywgb3IgRkFMU0UgaWYgdGhhdCB5ZWFyIGRpZCBub3QuIEJhc2VkIG9uIHRoaXMgdmFyaWFibGUgd2hpY2ggb2YgdGhlIGZvbGxvd2luZyBzdGF0ZW1lbnRzIGlzIHRydWU/DQoNCkV2ZXJ5IHllYXIgdGhlcmUgYXJlIG1vcmUgZ2lybHMgYm9ybiB0aGFuIGJveXMuDQoNCkV2ZXJ5IHllYXIgdGhlcmUgYXJlIG1vcmUgYm95cyBib3JuIHRoYW4gZ2lybHMuDQoNCkhhbGYgb2YgdGhlIHllYXJzIHRoZXJlIGFyZSBtb3JlIGJveXMgYm9ybiwgYW5kIHRoZSBvdGhlciBoYWxmIG1vcmUgZ2lybHMgYm9ybi4NCg0KYGBge3J9DQpwcmVzZW50IDwtIHByZXNlbnQgJT4lDQptdXRhdGUobW9yZV9ib3lzID0gYm95cyA+IGdpcmxzKQ0KDQpnZ3Bsb3QoZGF0YSA9IHByZXNlbnQsIGFlcyh4ID0geWVhciwgeSA9IG1vcmVfYm95cykpICsgZ2VvbV9saW5lKCkNCmBgYA0KDQpDYWxjdWxhdGUgdGhlIGJveS10by1naXJsIHJhdGlvIGVhY2ggeWVhciwgYW5kIHN0b3JlIHRoZXNlIHZhbHVlcyBpbiBhIG5ldyB2YXJpYWJsZSBjYWxsZWQgcHJvcF9ib3lfZ2lybCBpbiB0aGUgIHByZXNlbnQgZGF0YXNldC4gUGxvdCB0aGVzZSB2YWx1ZXMgb3ZlciB0aW1lLiBXaGljaCBvZiB0aGUgZm9sbG93aW5nIGJlc3QgZGVzY3JpYmVzIHRoZSB0cmVuZD8NCg0KVGhlcmUgYXBwZWFycyB0byBiZSBubyB0cmVuZCBpbiB0aGUgYm95LXRvLWdpcmwgcmF0aW8gZnJvbSAxOTQwIHRvIDIwMTMuDQoNClRoZXJlIGlzIGluaXRpYWxseSBhbiBpbmNyZWFzZSBpbiBib3ktdG8tZ2lybCByYXRpbywgd2hpY2ggcGVha3MgYXJvdW5kIDE5NjAuIEFmdGVyIDE5NjAgdGhlcmUgaXMgYSBkZWNyZWFzZSBpbiB0aGUgYm95LXRvLWdpcmwgcmF0aW8sIGJ1dCB0aGUgbnVtYmVyIGJlZ2lucyB0byBpbmNyZWFzZSBpbiB0aGUgbWlkIDE5NzBzLg0KDQpUaGVyZSBpcyBpbml0aWFsbHkgYSBkZWNyZWFzZSBpbiB0aGUgYm95LXRvLWdpcmwgcmF0aW8sIGFuZCB0aGVuIGFuIGluY3JlYXNlIGJldHdlZW4gMTk2MCBhbmQgMTk3MCwgZm9sbG93ZWQgYnkgYSBkZWNyZWFzZS4NClRoZSBib3ktdG8tZ2lybCByYXRpbyBoYXMgaW5jcmVhc2VkIG92ZXIgdGltZS4NCg0KVGhlcmUgaXMgYW4gaW5pdGlhbCBkZWNyZWFzZSBpbiB0aGUgYm95LXRvLWdpcmwgcmF0aW8gYm9ybiBidXQgdGhpcyBudW1iZXIgYXBwZWFycyB0byBsZXZlbCBhcm91bmQgMTk2MCBhbmQgcmVtYWluIGNvbnN0YW50IHNpbmNlIHRoZW4uDQoNCmBgYHtyfQ0KcHJlc2VudCA8LSBwcmVzZW50ICU+JQ0KbXV0YXRlKHByb3BfYm95X2dpcmwgPSBib3lzL2dpcmxzKQ0KDQpnZ3Bsb3QoZGF0YSA9IHByZXNlbnQsIGFlcyh4ID0geWVhciwgeSA9IHByb3BfYm95X2dpcmwpKSArIGdlb21fbGluZSgpDQpgYGANCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCmBgYHtyfQ0KZGF0YSgibnljZmxpZ2h0cyIpDQpgYGANCg0KDQpgYGB7cn0NCm5hbWVzKG55Y2ZsaWdodHMpDQpgYGANCg0KYGBge3J9DQpWaWV3KG55Y2ZsaWdodHMpDQpgYGANCg0KYGBge3J9DQo/bnljZmxpZ2h0cw0KYGBgDQoNCmBgYHtyfQ0Kc3RyKG55Y2ZsaWdodHMpDQpgYGANCg0KYGBge3J9DQpnZ3Bsb3QoZGF0YSA9IG55Y2ZsaWdodHMsIGFlcyh4ID0gZGVwX2RlbGF5KSkgKyBnZW9tX2hpc3RvZ3JhbSgpDQpgYGANCg0KDQpgYGB7cn0NCmdncGxvdChkYXRhID0gbnljZmxpZ2h0cywgYWVzKHggPSBkZXBfZGVsYXkpKSArIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMTUwKQ0KYGBgDQoNCg0KDQpgYGB7cn0NCnJkdV9mbGlnaHRzIDwtIG55Y2ZsaWdodHMgJT4lDQogIGZpbHRlcihkZXN0ID09ICJSRFUiKQ0KDQpnZ3Bsb3QoZGF0YSA9IHJkdV9mbGlnaHRzLCBhZXMoeCA9IGRlcF9kZWxheSkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oKQ0KYGBgDQoNCg0KYGBge3J9DQpyZHVfZmxpZ2h0cyAlPiUNCiAgc3VtbWFyaXNlKG1lYW5fZGQgPSBtZWFuKGRlcF9kZWxheSksIHNkX2RkID0gc2QoZGVwX2RlbGF5KSwgbiA9IG4oKSkNCmBgYA0KMS4gQ3JlYXRlIGEgbmV3IGRhdGEgZnJhbWUgdGhhdCBpbmNsdWRlcyBmbGlnaHRzIGhlYWRlZCB0byBTRk8gaW4gRmVicnVhcnksIGFuZCBzYXZlIA0KdGhpcyBkYXRhIGZyYW1lIGFzIGBzZm9fZmViX2ZsaWdodHNgLiBIb3cgbWFueSBmbGlnaHRzIG1lZXQgdGhlc2UgY3JpdGVyaWE/IA0KPG9sPg0KPGxpPiA2OCA8L2xpPiANCjxsaT4gMTM0NSA8L2xpPiANCjxsaT4gMjI4NiA8L2xpPiANCjxsaT4gMzU2MyA8L2xpPg0KPGxpPiAzMjczNSA8L2xpPg0KPC9vbD4NCmBgYHtyfQ0Kc2ZvX2ZlYl9mbGlnaHRzIDwtIG55Y2ZsaWdodHMgJT4lDQogIGZpbHRlcihkZXN0ID09ICJTRk8iLCBtb250aCA9PSAyKQ0KDQpzZm9fZmViX2ZsaWdodHMgJT4lDQogIHN1bW1hcmlzZShuID0gbigpKQ0KYGBgDQoyLiBNYWtlIGEgaGlzdG9ncmFtIGFuZCBjYWxjdWxhdGUgYXBwcm9wcmlhdGUgc3VtbWFyeSBzdGF0aXN0aWNzIGZvciAqKmFycml2YWwqKiANCmRlbGF5cyBvZiBgc2ZvX2ZlYl9mbGlnaHRzYC4gV2hpY2ggb2YgdGhlIGZvbGxvd2luZyBpcyBmYWxzZT8gDQo8b2w+DQo8bGk+IFRoZSBkaXN0cmlidXRpb24gaXMgdW5pbW9kYWwuIDwvbGk+IA0KPGxpPiBUaGUgZGlzdHJpYnV0aW9uIGlzIHJpZ2h0IHNrZXdlZC4gPC9saT4gDQo8bGk+IE5vIGZsaWdodCBpcyBkZWxheWVkIG1vcmUgdGhhbiAyIGhvdXJzLiA8L2xpPiANCjxsaT4gVGhlIGRpc3RyaWJ1dGlvbiBoYXMgc2V2ZXJhbCBleHRyZW1lIHZhbHVlcyBvbiB0aGUgcmlnaHQgc2lkZS4gPC9saT4NCjxsaT4gTW9yZSB0aGFuIDUwJSBvZiBmbGlnaHRzIGFycml2ZSBvbiB0aW1lIG9yIGVhcmxpZXIgdGhhbiBzY2hlZHVsZWQuIDwvbGk+DQo8L29sPg0KDQpgYGB7cn0NCnNmb19mZWJfZmxpZ2h0cw0KYGBgDQoNCg0KDQpgYGB7cn0NCmdncGxvdChkYXRhID0gc2ZvX2ZlYl9mbGlnaHRzLCBhZXMoeCA9IGFycl9kZWxheSkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxMCkNCmBgYA0KDQoNCg0KYGBge3J9DQpzZm9fZmViX2ZsaWdodHMgJT4lDQogIGdyb3VwX2J5KGNhcnJpZXIpICU+JQ0KICBzdW1tYXJpc2UoSVFSKGFycl9kZWxheSksIG1lZGlhbihhcnJfZGVsYXkpLCBuID0gbigpKQ0KYGBgDQoNCg0KYGBge3J9DQpueWNmbGlnaHRzICU+JQ0KICBncm91cF9ieShtb250aCkgJT4lDQogIHN1bW1hcmlzZShtZWFuX2RkID0gbWVhbihkZXBfZGVsYXkpLG4gPSBuKCkpICU+JQ0KICBhcnJhbmdlKGRlc2MobWVhbl9kZCkpDQpgYGANCg0KDQpgYGB7cn0NCm55Y2ZsaWdodHMgJT4lDQogIGdyb3VwX2J5KG1vbnRoKSAlPiUNCiAgc3VtbWFyaXNlKG1lZGlhbl9kZCA9IG1lZGlhbihkZXBfZGVsYXkpLG4gPSBuKCkpICU+JQ0KICBhcnJhbmdlKGRlc2MobWVkaWFuX2RkKSkNCmBgYA0KDQoNCmBgYHtyfQ0KZ2dwbG90KG55Y2ZsaWdodHMsIGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGRlcF9kZWxheSkpICsNCiAgZ2VvbV9ib3hwbG90KCkNCmBgYA0KDQoNCmBgYHtyfQ0KbnljZmxpZ2h0cyA8LSBueWNmbGlnaHRzICU+JQ0KICBtdXRhdGUoZGVwX3R5cGUgPSBpZmVsc2UoYXJyX2RlbGF5IDwgNSwgIm9uIHRpbWUiLCAiZGVsYXllZCIpKQ0KDQpueWNmbGlnaHRzICU+JQ0KICBncm91cF9ieShvcmlnaW4pICU+JQ0KICBzdW1tYXJpc2Uob3RfZGVwX3JhdGUgPSBzdW0oZGVwX3R5cGUgPT0gIm9uIHRpbWUiKSAvIG4oKSkgJT4lICAgDQogIGFycmFuZ2UoZGVzYyhvdF9kZXBfcmF0ZSkpDQpgYGANCg0KYGBge3J9DQpnZ3Bsb3QoZGF0YSA9IG55Y2ZsaWdodHMsIGFlcyh4ID0gb3JpZ2luLCBmaWxsID0gZGVwX3R5cGUpKSArDQogIGdlb21fYmFyKCkNCmBgYA0KDQpgYGB7cn0NCm55Y2ZsaWdodHM8LW55Y2ZsaWdodHMgJT4lIA0KICBtdXRhdGUoYXZnX3NwZWVkID0gZGlzdGFuY2UvYWlyX3RpbWUpICU+JSANCiAgYXJyYW5nZShkZXNjKGF2Z19zcGVlZCkpDQpzZWxlY3QobnljZmxpZ2h0cyxhdmdfc3BlZWQsIHRhaWxudW0pDQpgYGANCg0KDQpgYGB7cn0NCm55Y2ZsaWdodHMNCmBgYA0KDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGEgPSBueWNmbGlnaHRzLCBhZXMoeSA9IGF2Z19zcGVlZCwgeCA9IGRpc3RhbmNlKSkgKyBnZW9tX3BvaW50KCkNCmBgYA0KYGBge3J9DQpueWNmbGlnaHRzIDwtIG55Y2ZsaWdodHMgJT4lIA0KICBtdXRhdGUoYXJyX3R5cGUgPSBpZmVsc2UoYXJyX2RlbGF5PD0wLCJvbiB0aW1lIiwiZGVsYXllZCIpKSANCg0KbnljZmxpZ2h0cyAlPiUgDQogIGdyb3VwX2J5KGRlcF90eXBlKSU+JQ0KICBzdW1tYXJpc2Uob3RfYXJyX3JhdGU9c3VtKGFycl90eXBlPT0ib24gdGltZSIpL24oKSkNCg0KYGBgDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCiAgDQoNCg0KDQoNCg0K